package com.vvv.designpattern.dprecated.state;

import com.vvv.designpattern.dprecated.DeprecatedConstants;
import com.vvv.designpattern.dprecated.observer.DeprecatedAbstractObserver;

import java.util.List;

/**
 * @author vvv
 * @date 2023-11-20 10 39
 * discription 状态模式：类的行为基于状态的变化而变化
 *
 * DeprecatedAbstractOrderState 在状态模式中充当了抽象状态角色，进行了状态的定义和状态转换的方法的定义
 *
 * DeprecatedAbstractOrderState 在观察者模式中充当了被观察者角色，
 * 定义通知某个被观察者的全部观察者角色的方法，所以要在被观察者中关联观察者角色
 * 定义能够动态地增加、删除观察者的方法
 * (被观察者是自愿被观察的，会主动通知观察者进行相关的操作）
 *
 * TODO 这里很奇怪，我认为被观察者和观察者应该是一一对应才对啊，也就是每个被观察者都有自己的观察者list
 * 但是这里的话，4个被观察者却共享了一个观察者list，那么这些增加、删除观察者的方法，岂不是会影响全部的被观察者？
 */
public abstract class DeprecatedAbstractOrderState {

    /**
     * 待支付状态
     */
    public static final String ORDER_WAIT_PAY = "ORDER_WAIT_PAY";
    /**
     * 待发货状态
     */
    public static final String ORDER_WAIT_SEND = "ORDER_WAIT_SEND";
    /**
     * 待收货状态
     */
    public static final String ORDER_WAIT_RECEIVE = "ORDER_WAIT_RECEIVE";
    /**
     * 订单完成状态
     */
    public static final String ORDER_FINISH = "ORDER_FINISH";

    /**
     * 关联抽象观察者
     */
    protected final List<DeprecatedAbstractObserver> observerList = DeprecatedConstants.OBSERVER_LIST;

    /**
     * 新增观察者
     * @param observer
     */
    public void addObserver(DeprecatedAbstractObserver observer) {
        this.observerList.add(observer);
    }

    /**
     * 移除观察者
     * @param observer
     */
    public void removeObserver(DeprecatedAbstractObserver observer) {
        this.observerList.remove(observer);
    }

    /**
     * 通知观察者进行相关操作
     * @param orderId
     * @param orderState
     */
    public void notifyObserver(String orderId, String orderState) {
        for (DeprecatedAbstractObserver observer : this.observerList) {
            observer.orderStateHandle(orderId, orderState);
        }
    }

    /**
     * 创建订单 null -> ORDER_WAIT_PAY
     * @param orderId
     * @param productId
     * @return
     */
    protected DeprecatedOrder createOrder(String orderId, String productId) {
        throw new UnsupportedOperationException();
    }

    /**
     * 订单支付 ORDER_WAIT_PAY -> ORDER_WAIT_SEND
     * @param orderId
     * @return
     */
    protected DeprecatedOrder payOrder(String orderId) {
        throw new UnsupportedOperationException();
    }

    /**
     * 订单发送 ORDER_WAIT_SEND -> ORDER_WAIT_RECEIVE
     * @param orderId
     * @return
     */
    protected DeprecatedOrder sendOrder(String orderId) {
        throw new UnsupportedOperationException();
    }

    /**
     * 订单签收 ORDER_WAIT_RECEIVE -> ORDER_FINISH
     * @param orderId
     * @return
     */
    protected DeprecatedOrder receiverOrder(String orderId) {
        throw new UnsupportedOperationException();
    }
}
